The best arrangement

Chan_Honman's Blog

什么是原码、反码、补码?

什么是原码、反码、补码?

第一部分:计算机里的“数字”和“符号”——原码、反码、补码

我们都知道,我们平时用的数字是十进制的,有0到9这十个符号。但计算机可不是这样,它只会“开”和“关”,就像电灯一样。所以,计算机的世界里只有两个数字:0 和 1

想象一下:

计算机的所有信息,包括文字、图片、声音、数字,最后都要变成一串串的 0 和 1,才能被计算机理解和处理。

那么,怎么用 0 和 1 来表示我们熟悉的数字,特别是负数呢? 这就引出了“原码”、“反码”、“补码”这三种计算机里表示数字的方法。

我们先假设计算机用**8个“小格子”**来存一个数字,就像有8盏小灯泡,每个灯泡只能是亮或灭。


1.1 原码:最“老实”的表示方法

“原码”就像我们平时写数字一样,最直观。

原码的缺点:

  1. “零”有两种表示: +00000 0000,而 -0 却是 1000 0000。两个不同的表示都代表“零”,这会让计算机很困惑,处理起来很麻烦。
  2. 加减法复杂: 如果要用原码直接做加减法,计算机需要先判断是正数还是负数,哪个大哪个小,然后再决定是相加还是相减。这就像我们人工算账一样,比较复杂。

1.2 反码:稍微“聪明”一点的表示方法

“反码”是为了解决原码加减法复杂的问题,迈出了一小步。

反码的缺点:


1.3 补码:计算机里最“实用”的表示方法

“补码”就是为了彻底解决“零”的两种表示和加减法复杂的问题,它是计算机里最主流、最常用的表示方法。

补码的优点:

  1. “零”的表示是唯一的: 无论是 +0 还是 -0,它们的补码最终都变成了 0000 0000。这样计算机就不用担心有两个零了。

  2. 加减法统一:

    最大的优点!有了补码,计算机做加减法就变得非常简单和统一了。比如,计算

    A - B
    

    ,计算机可以直接把它看成

    A + (-B 的补码)
    

    。所有的减法都变成了加法,大大简化了计算机的内部电路。

    • 例子:

      5 + (-5)
      

      (在计算机里就是

      +5
      

      的补码 加上

      -5
      

      的补码)

      • +5 的补码:0000 0101

      • -5 的补码:1111 1011

      • 两者相加:

          0000 0101 (+5)
        + 1111 1011 (-5)
        -----------
        1 0000 0000  (最左边的1溢出,8位只能存后面8位)
        
      • 结果就是 0000 0000,正好是 0 的补码,完美!

总结一下原码、反码、补码的关系(正数都一样,负数按顺序变):

数字8位原码8位反码8位补码
+50000 01010000 01010000 0101
-51000 01011111 10101111 1011

第二部分:数字的“翻译官”——进制之间的转换

我们平时用的是十进制,但计算机用的是二进制。为了方便人类查看和理解,还会用到八进制和十六进制。它们就像不同的语言,需要有“翻译官”来互相转换。

什么是“进制”?

“进制”就是计算数字时“逢几进一”的规则。


2.1 其他进制(二、八、十六)转十进制:用“位值”相加

这个方法很简单,就像我们理解十进制数字一样:一个数字的每一位都有一个“位置价值”(位权)。

方法: 把每个位置上的数字,乘以它对应的“位置价值”,然后全部加起来。

“位置价值”怎么算?就是“进制数”的“位数次方”。

例子:


2.2 十进制转其他进制:用“除法”和“余数”

这个方法就像是把一个大蛋糕(十进制数)分给不同进制的小朋友,看能分多少次,每次剩下多少。

方法: “除以基数取余数,倒着读余数”。

例子:


2.3 二进制与八进制/十六进制的“快速”翻译(因为是“亲戚”)

二进制、八进制、十六进制之间有一种特殊的“亲戚关系”,因为 8 是 23,16 是 24。这让它们之间的转换变得非常快,就像直接查字典一样。

记住一个对应关系:

方法:


8421 法:二进制和十进制的“速查表”

“8421 法”是专门用来快速地在4位二进制数十进制数之间进行转换的方法。它基于二进制数的“位值”概念,也就是我们之前说的“位置价值”。

请看这张“魔术卡片”:

位值 (权力值)8421
二进制数字(位)(位)(位)(位)

它的意思就是:

如果一个小格子灭了 (是0),那它就不代表任何值。


2.1 二进制转十进制 (用8421法):看亮灯,加数字

方法:

  1. 把一个4位二进制数,套到“8421”这四个位值下面。
  2. 哪个位上的灯是“1”(亮了),就把对应的位值加起来。
  3. 哪个位上的灯是“0”(灭了),就不用加。

例子:


2.2 十进制转二进制 (用8421法):凑数字,开电灯

方法:

  1. 拿到一个十进制数(只能是 0 到 15 之间的),看看它能由 8、4、2、1 哪些数字组合而成
  2. 如果用到了某个位值,那个位置的二进制就是“1”(灯亮)。
  3. 如果没用到,那个位置的二进制就是“0”(灯灭)。

例子:


8421 法和八进制/十六进制的“亲戚关系”

8421 法不仅仅能帮我们翻译4位二进制和十进制,它也是二进制和八进制/十六进制快速转换的基础

我们再来看看这个图:

十六进制二进制(4位)八进制(3位)
00000000
10001001
20010010
30011011
40100100
50101101
60110110
70111111
81000(无对应)
91001(无对应)
A (10)1010(无对应)
B (11)1011(无对应)
C (12)1100(无对应)
D (13)1101(无对应)
E (14)1110(无对应)
F (15)1111(无对应)

你看,每一位十六进制数,直接就对应了四位二进制数(正好是 8421 法能表示的范围)。每一位八进制数,直接就对应了三位二进制数(8421 法的前三位,或者说 421 法)。

所以,当你需要转换:


总结:

8421 法就像一个方便的小工具,让你在 0-15 范围内的十进制数和 4 位二进制数之间快速切换。而这种“按固定位数分组”的思维,正是二进制、八进制和十六进制之间快速转换的秘密。